﻿#pragma once
/*说明：
本方法仅作为牛顿迭代之外的另一种尝试，之所以又写这个算法，是因为发现numpy、MATLAB等主流的求解工具在求解多项式方程时
入手的方向都是将方程的伴随矩阵求出来，进而利用其他方法将伴随矩阵的特征值求出，而求出的特征值即为多项式方程的根。
本方法是在初赛的结果已经完全满足比赛要求之后才开始的一个新探索，仅供参考。
结果：
1.本方法在求解重根时的效果依然不佳，误差常常高达到1e-2。
2.本方法在引入高精度库之后仍然没法将误差下降至指定要求。
3.本方法相较于牛顿迭代的优势在于其能够求出方程的复平面的根。

注：numpy和MATLAB在求解多项式遇到重根时的表现同样是不佳，与本方法的误差相差不大。
*/
#include "acis/dcl_cstr.h"
#include "acis/dcl_kern.h"
#include "acis/acis.hxx"
#include "acis/api.hxx"
#include <boost/multiprecision/cpp_dec_float.hpp>
using namespace boost::multiprecision;
/**
 * @brief		求解定义域上单变量方程的根
 * @details		此接口测试一元1-8次多项式，需从law树中获取方程的系数,求出的根需满足所给定义域，且无重复根
 * @param[in]	input_law	输入方程（law树形式）
 * @param[in]	start	定义域左边界
 * @param[in]	end		定义域右边界
 * @param[out]	size	用于返回根的个数
 * @param[out]	answer	用于返回根的结果
 * @return		函数执行结果
 * @note		此接口与ACIS中 kernapi 文件中的 api_nroots_of_law 进行对比
 */
DECL_KERN outcome answer_api_nroots_of_chara(cpp_dec_float_50 coef[], cpp_dec_float_50 start, cpp_dec_float_50 end, int* size, cpp_dec_float_50** answer, int N);
